جزوه · فصل نهم · جلسه ۸۷ · دستور test ← بازگشت به فهرست
📘 فصل نهم · جلسه ۸۷ دستور test
📅 تاریخ: پنجشنبه، ۴ شهریور ۱۴۰۵ 👤 مدرس: محمد عابدینی 🐚 Zsh · 🐧 Debian (کالی) · 📦 Red Hat
این جلسه یکی از مباحث بسیار مهم در اسکریپت‌نویسی است. دستور test و براکت [ ] پایه و اساس شرط‌ها در Bash هستند و در آزمون‌های LPIC و RHCSA بسیار پرتکرارند.
🔍 قبل از شروع، یه مثال ساده:

فرض کن یه دوربین مداربسته داری که مدام چک می‌کنه که آیا کسی جلوی درب هست یا نه. توی لینوکس، دستور test دقیقاً همینه: به اسکریپت شما اجازه می‌ده شرایط مختلف رو بررسی کنه و بر اساس اون تصمیم بگیره. این جلسه بهت یاد میده چطور با test و [ ] فایل‌ها، دایرکتوری‌ها، اعداد و رشته‌ها رو بررسی کنی!

▍ دستور test چیست؟

test یک دستور داخلی در Bash است که برای بررسی شرایط و مقایسه‌ها استفاده می‌شود. این دستور خروجی مستقیم نمایش نمی‌دهد، بلکه یک کد خروجی (Exit Status) برمی‌گرداند:

🔑 نکته کلیدی: براکت [ ] در Bash، در واقع همان دستور test است که به صورت زیباتر نوشته شده است. [ condition ] معادل test condition است.
نکته امتحانی: [ ] و test هر دو یک کار را انجام می‌دهند. در اسکریپت‌نویسی، معمولاً از [ ] استفاده می‌شود.

▍ انواع بررسی‌ها با test

دستور test سه دسته اصلی بررسی انجام می‌دهد:

📁 بررسی فایل‌ها و دایرکتوری‌ها

  • وجود فایل (-e)
  • وجود دایرکتوری (-d)
  • قابل خواندن (-r)
  • قابل نوشتن (-w)
  • قابل اجرا (-x)
  • خالی نبودن (-s)

🔢 مقایسه اعداد

  • برابر (-eq)
  • بزرگتر (-gt)
  • کوچکتر (-lt)
  • بزرگتر یا مساوی (-ge)
  • کوچکتر یا مساوی (-le)
  • نابرابر (-ne)

📝 مقایسه رشته‌ها

  • برابر (=)
  • نابرابر (!=)
  • خالی بودن رشته (-z)
  • غیرخالی بودن رشته (-n)

▍ بررسی فایل‌ها و دایرکتوری‌ها

گزینه معنی مثال
-e آیا فایل/دایرکتوری وجود دارد؟ test -e file.txt
-d آیا دایرکتوری وجود دارد؟ test -d /home
-f آیا فایل معمولی وجود دارد؟ test -f script.sh
-r آیا فایل قابل خواندن است؟ test -r file.txt
-w آیا فایل قابل نوشتن است؟ test -w file.txt
-x آیا فایل قابل اجرا است؟ test -x script.sh
-s آیا فایل وجود دارد و خالی نیست؟ test -s file.txt

• مثال‌های عملی

┌──(ya3in㉿kali)-[~] └─$ touch mabedini └─$ test -e mabedini && echo "فایل وجود دارد" فایل وجود دارد

توضیح: test -e mabedini بررسی می‌کند که آیا فایل mabedini وجود دارد یا نه. چون وجود دارد، $? برابر ۰ است و && پیام را چاپ می‌کند.

┌──(ya3in㉿kali)-[~] └─$ test -x mabedini && echo "قابل اجرا است" # هیچ خروجی ندارد چون قابل اجرا نیست └─$ ls -l mabedini -rw-r--r-- 1 ya3in ya3in 0 Aug 23 22:28 mabedini └─$ chmod +x mabedini └─$ test -x mabedini && echo "قابل اجرا است" قابل اجرا است

توضیح: ابتدا فایل mabedini قابل اجرا نیست، پس شرط test -x false برمی‌گرداند. بعد از chmod +x، شرط true می‌شود و پیام چاپ می‌شود.

نکته: test -x بررسی می‌کند که آیا فایل قابل اجرا است یا نه. این برای اسکریپت‌ها بسیار مهم است.

▍ مقایسه دو فایل از نظر قدمت

با test می‌توانید بررسی کنید که کدام فایل جدیدتر (newer) یا قدیمی‌تر (older) است.

گزینه معنی مثال
file1 -nt file2 آیا file1 جدیدتر از file2 است؟ test file1 -nt file2
file1 -ot file2 آیا file1 قدیمی‌تر از file2 است؟ test file1 -ot file2
┌──(ya3in㉿kali)-[~] └─$ touch file1 └─$ touch file2 └─$ test file1 -nt file2 && echo "file1 جدیدتر است" # ممکن است بسته به زمان ایجاد، خروجی متفاوت باشد └─$ test file2 -nt file1 && echo "file2 جدیدتر است" file2 جدیدتر است

توضیح: -nt مخفف Newer Than و -ot مخفف Older Than است.

▍ مقایسه اعداد با test

گزینه معنی مثال
num1 -eq num2 برابر (Equal) [ 5 -eq 5 ] → True
num1 -ne num2 نابرابر (Not Equal) [ 5 -ne 3 ] → True
num1 -gt num2 بزرگتر (Greater Than) [ 5 -gt 3 ] → True
num1 -lt num2 کوچکتر (Less Than) [ 5 -lt 3 ] → False
num1 -ge num2 بزرگتر یا مساوی (Greater or Equal) [ 5 -ge 5 ] → True
num1 -le num2 کوچکتر یا مساوی (Less or Equal) [ 5 -le 5 ] → True

• مثال‌های عملی

┌──(ya3in㉿kali)-[~] └─$ [ 1 -eq 1 ] && echo "True" || echo "False" True └─$ [ 5 -gt 1 ] && echo "True" || echo "False" True └─$ [ 5 -gt 10 ] && echo "True" || echo "False" False

توضیح: && در صورت True اجرا می‌شود و || در صورت False.

┌──(ya3in㉿kali)-[~] └─$ [ 10 -ge 10 ] && echo "بزرگتر یا مساوی" بزرگتر یا مساوی └─$ [ 3 -le 5 ] && echo "کوچکتر یا مساوی" کوچکتر یا مساوی
نکته: در مقایسه اعداد، از عملگرهای متنی مانند -eq، -gt استفاده می‌شود، نه از = و > که برای رشته‌ها هستند.

▍ مقایسه رشته‌ها

گزینه معنی مثال
str1 = str2 برابر [ "ali" = "ali" ] → True
str1 != str2 نابرابر [ "ali" != "reza" ] → True
-z str رشته خالی است [ -z "" ] → True
-n str رشته غیرخالی است [ -n "hello" ] → True
┌──(ya3in㉿kali)-[~] └─$ [ "hello" = "hello" ] && echo "برابر" برابر └─$ [ "hello" != "world" ] && echo "نابرابر" نابرابر └─$ [ -z "" ] && echo "خالی است" خالی است └─$ [ -n "text" ] && echo "غیرخالی است" غیرخالی است
⚠️ توجه: در مقایسه رشته‌ها، حتماً رشته‌ها را داخل دابل کوتیشن ("") قرار دهید تا از خطاهای ناشی از فاصله یا کاراکترهای خاص جلوگیری شود.

▍ استفاده از [ ] در اسکریپت

#!/bin/bash # بررسی وجود فایل filename="mabedini" if [ -e "$filename" ]; then echo "فایل $filename وجود دارد." else echo "فایل $filename وجود ندارد." fi
#!/bin/bash # بررسی مجوز اجرا if [ -x "script.sh" ]; then echo "اسکریپت قابل اجرا است." else echo "اسکریپت قابل اجرا نیست." fi

▍ جمع‌بندی و نکات مهم

✅ جمع‌بندی نهایی:
  • test و [ ] معادل هم هستند و برای بررسی شرایط استفاده می‌شوند.
  • بررسی فایل: -e (وجود)، -d (دایرکتوری)، -f (فایل معمولی)، -r (خواندنی)، -w (نوشتنی)، -x (اجرایی)، -s (غیرخالی).
  • مقایسه اعداد: -eq (برابر)، -ne (نابرابر)، -gt (بزرگتر)، -lt (کوچکتر)، -ge (بزرگتر یا مساوی)، -le (کوچکتر یا مساوی).
  • مقایسه رشته‌ها: = (برابر)، != (نابرابر)، -z (خالی)، -n (غیرخالی).
  • قدمت فایل: -nt (جدیدتر) و -ot (قدیمی‌تر).
  • نکته: در [ ] حتماً بین براکت و شرط فاصله بگذارید.
📝 تمرین پیشنهادی:

یک اسکریپت بنویسید که:

  • با read از کاربر یک نام فایل بگیرد.
  • با [ -e ] بررسی کند که آیا فایل وجود دارد یا نه.
  • اگر وجود داشت، با [ -r ]، [ -w ] و [ -x ] مجوزهای آن را بررسی کند و به کاربر گزارش دهد.
  • اگر وجود نداشت، پیام «فایل یافت نشد» چاپ کند.